// 引入正则校验方法
const regFn = require("../utils/regTest")
const { findName } = require("../model/user")
// 导入密码加密
const bcryptjs = require("bcryptjs")
// 导入token
const { getToken, verToken } = require("../utils/useToken")

// 验证密码和重复密码是否相等
function repasswordReg(req, res, next) {
  // 判断请求头带来的参数是否合法
  const { password, repassword } = req.body

  if (password !== repassword || !repassword) {
    return next({
      code: -2,
      message: "两次输入密码不一致"
    })
  }
  next()
}

// 验证用户名密码是否合法
function namePassReg(req, res, next) {
  // 判断请求头带来的参数是否合法
  const { username, password } = req.body

  // 校验用户名密码是否为空
  if (!username || !password) {
    return next({
      code: -2,
      message: "用户名或密码为空"
    })
  }

  // 正则校验,如果校验有一个不通过,则执行错误处理中间件
  if (!regFn.usernameReg(username) || !regFn.passwordReg(password)) {
    return next({
      code: -2,
      message: "你的用户名或者密码格式错误"
    })
  }

  // 校验成功
  next()
}

// 验证用户名是否唯一
async function userOnly(req, res, next) {
  const { username } = req.body
  const result = await findName(username)
  if (result) {
    return next({
      code: -1,
      message: "用户名已存在"
    })
  }
  next()
}

// 登录验证,用户名,密码是否正确
async function userPassRight(req, res, next) {
  const { username, password } = req.body
  // 在数据库中找到username,在进行密码是否正确的校验,密码正确,则登录成功
  const result = await findName(username)
  if (!result) {
    return next({
      code: -2,
      message: "用户名不存在"
    })
  }
  // 密码解密比较
  if (!bcryptjs.compareSync(password, result.password)) {
    return next({
      code: -2,
      message: "用户名或密码错误"
    })
  }

  next()
}

// 验证token是否失效
async function tokenAble(req, res, next) {
  const { user, token } = req.body
  // 验证token
  const state = await verToken(token)
  if (!state) {
    next({
      code: -3,
      message: "token已失效,请重新登录"
    })
  }
  next()
}

module.exports = { repasswordReg, namePassReg, userOnly, userPassRight, tokenAble }